package Shifu.Login;

import java.io.*;
import java.rmi.Remote;
import java.rmi.RemoteException;
import java.rmi.RMISecurityManager;
import java.rmi.Naming;
import java.lang.Runnable;
import java.util.Properties;
import java.sql.SQLException;
import java.rmi.server.UnicastRemoteObject;
import Shifu.MainServer.Net.LeecherShellPeerServer;
import Shifu.MainServer.Net.SeederShellPeerServer;

/**
 * Classe che implementa il reale client
 */

public class ClientLogin implements Serializable,Runnable {

	private static LoginInterface stub = null;	//stub per il server di login

	
	public void run() {

		System.out.println("*** Client Login ***");

		if (System.getSecurityManager() == null) 
                 	System.setSecurityManager(new RMISecurityManager());

		try {
			
			InputStreamReader is = new InputStreamReader(System.in);
			BufferedReader buffer = new BufferedReader(is);

			System.out.print("Inserisci l'ip e la porta del Mainserver [xxx.xxx.xxx.xxx:porta] :");	
			String address = buffer.readLine();
			String name = "//"+address+"/Login";
			System.out.println("Richiedo lo stub per il server di Login all indirizzo !"+address);
			stub = (LoginInterface) Naming.lookup(name);
			System.out.println("Collegamento al server di login stabilito !");
			this.menu();			
				

		} catch (Exception e) {
			System.out.println("SimpleClient exception: " + e.getMessage());
              		e.printStackTrace();
		} 		


	}

	/**
         * Visualizza il menu
         */
          
	public void menu() {

		InputStreamReader is = null;	

		try {

			is = new InputStreamReader(System.in);
			BufferedReader buffer = new BufferedReader(is);
			String command = "";	//comando


			/* continua fino a che non viene dato il comando exit */
		//	while(!command.equals("5")) {

				this.printOption();
				System.out.print("ClientLogin>");
				command = buffer.readLine();
				
				// Discriminazione del comando dato

				if (command.equals("1")) {
					System.out.println("Avviare il sistema come Leecher");
					LoginLeecher();
				}

				else if (command.equals("2")) {
					System.out.println("Avviare il sistema come Seeder");
					LoginSeeder();
				}

				else if (command.equals("3")) {
					System.out.println("Registra un nuovo peer");
					registrate();
				}

				else if (command.equals("4")) {
					System.out.println("Rimuovi un peer");
					remove();
				}

				else if (command.equals("5")) {
					System.out.println("Uscita");
				}

				else {
					System.out.println("ClientLogin: Comando sconosciuto!");
				}
				
		//	} 

		} catch (IOException ioe) {
		 	System.out.println("Errore nel'input da tastiera (Menu)"+ioe.getMessage());
		}

	/*	finally {		

			try {	
				is.close();	
			} catch (IOException ioe) {
				System.out.println("ClientLogin:Errore nella chiusura dell'input stream");
			}
		}		
	*/
		stub = null;
	}

	/**
         * Visualizza le opzioni
         */

	public void printOption() {
		System.out.println("\nMENU:\n*1 Login come Leecher\n*2 Login come Seeder\n*3 Registra un nuovo peer\n*4 Rimuovi un peer\n*5 Uscita");
	}

	/**
         * Esegue il login di un client Leecher
	 * @retun 1 se ha buon esito -1 altrimenti 
         */

	public int LoginLeecher() {

		InputStreamReader is = null;	

		try {

			is = new InputStreamReader(System.in);
			BufferedReader buffer = new BufferedReader(is);
			String username = "";	// username
			String password = "";   // password
			
			System.out.print("Username: ");
			username = buffer.readLine();
			System.out.print("Password: ");
			password = buffer.readLine();
			System.out.println("\nInvio richiesta di login");
			LeecherShellPeerServer peerserver = stub.loginLeecher(username,password);	//Effettua il login
			//Entra se il login è valido
			if (peerserver != null)	{
				System.out.println("\nClientLogin:Login Effettuato !\nEsportazione del PeerServer sulla porta 5556 e registrazione al MainServer");
				LeecherShellPeerServer stub = (LeecherShellPeerServer) UnicastRemoteObject.exportObject(peerserver,5556);
				stub.executeShell();
				stub = null;		//metto a null lo stub
			} else {
				System.out.println("\nClientLogin:Spiacente credenziali non valide !");
			}	

		} catch (IOException ioe) {
		 	System.out.println("ClientLogin:Errore nel'input da tastiera (LoginLeecher)"+ioe.getMessage());
			ioe.printStackTrace();	
			return -1;
		} catch (SQLException sqle) {
		 	System.out.println("ClientLogin:Errore SQL nel server di Login");
			return -1;
		}		

		return -1;		
	
	}

	/**
         * Esegue il login di un client Seeder
	 * @retun 1 se ha buon esito -1 altrimenti 
         */

	public int LoginSeeder() {

		InputStreamReader is = null;	

		try {

			is = new InputStreamReader(System.in);
			BufferedReader buffer = new BufferedReader(is);
			String username = "";	// username
			String password = "";   // password
			
			System.out.print("Username: ");
			username = buffer.readLine();
			System.out.print("Password: ");
			password = buffer.readLine();
			System.out.println("\nInvio richiesta di login");
			LeecherShellPeerServer peerserver = stub.loginSeeder(username,password);	//Effettua il login
			//Entra se il login è valido
			if (peerserver != null)	{
				System.out.println("\nClientLogin:Login Effettuato !\nEsportazione del PeerServer sulla porta 6666 e registrazione al MainServer");
				SeederShellPeerServer stub = (SeederShellPeerServer) UnicastRemoteObject.exportObject(peerserver,6666);
				stub.executeShell();
				stub = null;		//metto a null lo stub
			} else {
				System.out.println("\nClientLogin:Spiacente credenziali non valide !");
			}	

		} catch (IOException ioe) {
		 	System.out.println("ClientLogin:Errore nel'input da tastiera (LoginSeeder)"+ioe.getMessage());
			return -1;
		} catch (SQLException sqle) {
		 	System.out.println("ClientLogin:Errore SQL nel server di Login");
			return -1;
		}		

		return -1;		
	
	}

	/**
         * Registra un nuovo peer di tipo Leecher
	 * @retun 1 se ha buon esito -1 altrimenti 
         */

	public int registrate() {

		InputStreamReader is = null;	

		try {

			is = new InputStreamReader(System.in);
			BufferedReader buffer = new BufferedReader(is);
			String username = "";	// username
			String password = "";   // password
			
			System.out.print("Username: ");
			username = buffer.readLine();
			System.out.print("Password: ");
			password = buffer.readLine();
			System.out.println("\nInvio richiesta registrazione nuovo peer");
			boolean result = stub.registratePeer(username,password);	//Effettua registrazione peer
			if (result)	
				System.out.println("\nClientLogin:Registrazione del peer: "+username+" effettuata. Buon proseguimento");
			 else 
				System.out.println("\nClientLogin:Spiacente registrazione del peer "+username+" fallita!");
		
			stub = null;		//metto a null lo stub
		} catch (IOException ioe) {
		 	System.out.println("ClientLogin:Errore nel'input da tastiera (registrate)"+ioe.getMessage());
			return -1;
		} catch (SQLException sqle) {
		 	System.out.println("ClientLogin:Errore SQL nel server di Login");
			return -1;
		}		

		return -1;		

	}

	/**
         * Rimuove un peer
	 * @retun 1 se ha buon esito -1 altrimenti 
         */

	public int remove() {

		InputStreamReader is = null;	

		try {

			is = new InputStreamReader(System.in);
			BufferedReader buffer = new BufferedReader(is);
			String username = "";
			String password = ""; 
			
			System.out.print("Username: ");
			username = buffer.readLine();
			System.out.print("Password: ");
			password = buffer.readLine();
			System.out.println("\nInvio richiesta rimozione peer");
			boolean result = stub.removePeer(username,password);	//Effettua registrazione peer
			//Entra se il login è valido
			if (result) {	
				System.out.println("\nClientLogin:Rimozione del peer: "+username+" effettuata. Addio :-( ");
				return 1;
			 } else 
				System.out.println("\nClientLogin:Spiacente rimozione del peer "+username+" fallita!");
		
			stub = null;		//metto a null lo stub
		} catch (IOException ioe) {
		 	System.out.println("ClientLogin:Errore nel'input da tastiera (remove)"+ioe.getMessage());
			return -1;
		} catch (SQLException sqle) {
		 	System.out.println("ClientLogin:Errore SQL nel server di Login");
			return -1;
		}
				
		return -1;
	}
		

}
